Floating point numbers

Understanding Part 1 of the Assignment


In [149]:
import struct
def printfloat(f):
    b= ''.join(bin(c).replace('0b', '').rjust(8, '0') for c in struct.pack('!d', f))
    print("%+.18f   %s %s %s "%(f,b[0],b[1:12],b[12:]))

In [150]:
def f(x):
    return ((x+1.)-1.)/x

In [151]:
f(1e-14)


Out[151]:
0.9992007221626409

In [152]:
printfloat(1.)
printfloat(1.e-14)
printfloat(1.+1.e-14)
printfloat((1.+1.e-14)-1.0)
printfloat(((1.+1.e-14)-1.0)/1e-14)


+1.000000000000000000   0 01111111111 0000000000000000000000000000000000000000000000000000 
+0.000000000000010000   0 01111010000 0110100001001001101110000110101000010010101110011011 
+1.000000000000009992   0 01111111111 0000000000000000000000000000000000000000000000101101 
+0.000000000000009992   0 01111010000 0110100000000000000000000000000000000000000000000000 
+0.999200722162640886   0 01111111110 1111111110010111001111001010111110101000000000000000 

Understanding part 2 of the assignment


In [153]:
def g(x):
    for i in range(620):
        x = x*10
    return x

In [154]:
g(1.1)


Out[154]:
inf

In [155]:
printfloat(1.1)
printfloat(1.1*2.)
printfloat(1.1*2.*2.*2.*2.*2.)
x = 1.1
for i in range(1023):
    x = x*2.
printfloat(x)
printfloat(2.*x)


+1.100000000000000089   0 01111111111 0001100110011001100110011001100110011001100110011010 
+2.200000000000000178   0 10000000000 0001100110011001100110011001100110011001100110011010 
+35.200000000000002842   0 10000000100 0001100110011001100110011001100110011001100110011010 
+98873122417427382908473023632275606974479585989181125770191586378583137703214499471837230003180407951447924604472070704082121749617910118260818040426085411364459534523001698181988912585028057835850081401098701903474409853464050558133894031280936535995263854668699094060454612769188010537093426902669362987008.000000000000000000   0 11111111110 0001100110011001100110011001100110011001100110011010 
+inf   0 11111111111 0000000000000000000000000000000000000000000000000000 

In [32]:
2.**1023


Out[32]:
8.98846567431158e+307

Working with packages

Numpy


In [35]:
import numpy as np

In [37]:
pi = np.pi

Creating numpy arrays from python lists


In [40]:
a = [1.,2.,3.,4.]

In [43]:
b = np.array([1.,2.,3.,4.])

In [45]:
2.*b+7.


Out[45]:
array([ 9., 11., 13., 15.])

Creating arrays with np.zeros


In [47]:
c  = np.zeros(1000)

In [48]:
c[0] = 9

In [50]:
c[999] = 7.

In [51]:
c


Out[51]:
array([9., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,
       0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,
       0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,
       0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,
       0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,
       0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,
       0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,
       0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,
       0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,
       0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,
       0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,
       0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,
       0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,
       0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,
       0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,
       0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,
       0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,
       0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,
       0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,
       0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,
       0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,
       0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,
       0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,
       0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,
       0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,
       0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,
       0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,
       0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,
       0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,
       0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,
       0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,
       0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,
       0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,
       0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,
       0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,
       0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,
       0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,
       0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,
       0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,
       0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,
       0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,
       0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,
       0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,
       0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,
       0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,
       0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,
       0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,
       0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,
       0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,
       0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,
       0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,
       0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,
       0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,
       0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,
       0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,
       0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,
       0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,
       0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,
       0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 7.])

Creating arrays with linspace


In [56]:
np.linspace(0.,10.,10)


Out[56]:
array([ 0.        ,  1.11111111,  2.22222222,  3.33333333,  4.44444444,
        5.55555556,  6.66666667,  7.77777778,  8.88888889, 10.        ])

Arrays have a datatype too

Floating point by default. Here is an integer one:


In [57]:
np.zeros(10,dtype=int)


Out[57]:
array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0])

Matplotlib

Plotting data with plot and scatter


In [58]:
%matplotlib inline
import matplotlib.pyplot as plt

In [100]:
fig, ax = plt.subplots(1,1)
ax.plot(np.array([1,2]),np.array([3,4]))
ax.plot(np.array([1,2]),np.array([7,2]))

ax.scatter(np.array([1,2]),np.array([3,4]))
ax.scatter(np.array([1,2]),np.array([7,2]))


Out[100]:
<matplotlib.collections.PathCollection at 0x10c8d0390>

Plotting a function


In [156]:
x = np.linspace(0.,10.,300)

In [157]:
x


Out[157]:
array([ 0.        ,  0.03344482,  0.06688963,  0.10033445,  0.13377926,
        0.16722408,  0.2006689 ,  0.23411371,  0.26755853,  0.30100334,
        0.33444816,  0.36789298,  0.40133779,  0.43478261,  0.46822742,
        0.50167224,  0.53511706,  0.56856187,  0.60200669,  0.63545151,
        0.66889632,  0.70234114,  0.73578595,  0.76923077,  0.80267559,
        0.8361204 ,  0.86956522,  0.90301003,  0.93645485,  0.96989967,
        1.00334448,  1.0367893 ,  1.07023411,  1.10367893,  1.13712375,
        1.17056856,  1.20401338,  1.23745819,  1.27090301,  1.30434783,
        1.33779264,  1.37123746,  1.40468227,  1.43812709,  1.47157191,
        1.50501672,  1.53846154,  1.57190635,  1.60535117,  1.63879599,
        1.6722408 ,  1.70568562,  1.73913043,  1.77257525,  1.80602007,
        1.83946488,  1.8729097 ,  1.90635452,  1.93979933,  1.97324415,
        2.00668896,  2.04013378,  2.0735786 ,  2.10702341,  2.14046823,
        2.17391304,  2.20735786,  2.24080268,  2.27424749,  2.30769231,
        2.34113712,  2.37458194,  2.40802676,  2.44147157,  2.47491639,
        2.5083612 ,  2.54180602,  2.57525084,  2.60869565,  2.64214047,
        2.67558528,  2.7090301 ,  2.74247492,  2.77591973,  2.80936455,
        2.84280936,  2.87625418,  2.909699  ,  2.94314381,  2.97658863,
        3.01003344,  3.04347826,  3.07692308,  3.11036789,  3.14381271,
        3.17725753,  3.21070234,  3.24414716,  3.27759197,  3.31103679,
        3.34448161,  3.37792642,  3.41137124,  3.44481605,  3.47826087,
        3.51170569,  3.5451505 ,  3.57859532,  3.61204013,  3.64548495,
        3.67892977,  3.71237458,  3.7458194 ,  3.77926421,  3.81270903,
        3.84615385,  3.87959866,  3.91304348,  3.94648829,  3.97993311,
        4.01337793,  4.04682274,  4.08026756,  4.11371237,  4.14715719,
        4.18060201,  4.21404682,  4.24749164,  4.28093645,  4.31438127,
        4.34782609,  4.3812709 ,  4.41471572,  4.44816054,  4.48160535,
        4.51505017,  4.54849498,  4.5819398 ,  4.61538462,  4.64882943,
        4.68227425,  4.71571906,  4.74916388,  4.7826087 ,  4.81605351,
        4.84949833,  4.88294314,  4.91638796,  4.94983278,  4.98327759,
        5.01672241,  5.05016722,  5.08361204,  5.11705686,  5.15050167,
        5.18394649,  5.2173913 ,  5.25083612,  5.28428094,  5.31772575,
        5.35117057,  5.38461538,  5.4180602 ,  5.45150502,  5.48494983,
        5.51839465,  5.55183946,  5.58528428,  5.6187291 ,  5.65217391,
        5.68561873,  5.71906355,  5.75250836,  5.78595318,  5.81939799,
        5.85284281,  5.88628763,  5.91973244,  5.95317726,  5.98662207,
        6.02006689,  6.05351171,  6.08695652,  6.12040134,  6.15384615,
        6.18729097,  6.22073579,  6.2541806 ,  6.28762542,  6.32107023,
        6.35451505,  6.38795987,  6.42140468,  6.4548495 ,  6.48829431,
        6.52173913,  6.55518395,  6.58862876,  6.62207358,  6.65551839,
        6.68896321,  6.72240803,  6.75585284,  6.78929766,  6.82274247,
        6.85618729,  6.88963211,  6.92307692,  6.95652174,  6.98996656,
        7.02341137,  7.05685619,  7.090301  ,  7.12374582,  7.15719064,
        7.19063545,  7.22408027,  7.25752508,  7.2909699 ,  7.32441472,
        7.35785953,  7.39130435,  7.42474916,  7.45819398,  7.4916388 ,
        7.52508361,  7.55852843,  7.59197324,  7.62541806,  7.65886288,
        7.69230769,  7.72575251,  7.75919732,  7.79264214,  7.82608696,
        7.85953177,  7.89297659,  7.9264214 ,  7.95986622,  7.99331104,
        8.02675585,  8.06020067,  8.09364548,  8.1270903 ,  8.16053512,
        8.19397993,  8.22742475,  8.26086957,  8.29431438,  8.3277592 ,
        8.36120401,  8.39464883,  8.42809365,  8.46153846,  8.49498328,
        8.52842809,  8.56187291,  8.59531773,  8.62876254,  8.66220736,
        8.69565217,  8.72909699,  8.76254181,  8.79598662,  8.82943144,
        8.86287625,  8.89632107,  8.92976589,  8.9632107 ,  8.99665552,
        9.03010033,  9.06354515,  9.09698997,  9.13043478,  9.1638796 ,
        9.19732441,  9.23076923,  9.26421405,  9.29765886,  9.33110368,
        9.36454849,  9.39799331,  9.43143813,  9.46488294,  9.49832776,
        9.53177258,  9.56521739,  9.59866221,  9.63210702,  9.66555184,
        9.69899666,  9.73244147,  9.76588629,  9.7993311 ,  9.83277592,
        9.86622074,  9.89966555,  9.93311037,  9.96655518, 10.        ])

If it's a numpy function:


In [73]:
sinx = np.zeros(len(x))

Doing it element-wise by hand:


In [158]:
for i in range(len(x)):
    sinx[i] = np.sin(x[i])+np.random.random()  #adding some random numbers to simulate noise here

In [159]:
fig, ax = plt.subplots(1,1)
ax.scatter(x,sinx)


Out[159]:
<matplotlib.collections.PathCollection at 0x10d894940>

Creating a 2D numpy array


In [160]:
N = 100
grid = np.zeros((N,N))

In [161]:
grid[0][0] = 1.
grid[1][0] = 2.
grid[2,0] = 3.

In [162]:
grid


Out[162]:
array([[1., 0., 0., ..., 0., 0., 0.],
       [2., 0., 0., ..., 0., 0., 0.],
       [3., 0., 0., ..., 0., 0., 0.],
       ...,
       [0., 0., 0., ..., 0., 0., 0.],
       [0., 0., 0., ..., 0., 0., 0.],
       [0., 0., 0., ..., 0., 0., 0.]])

Filling the array with some data


In [163]:
for i in range(grid.shape[0]):
    for j in range(grid.shape[1]):
        grid[i][j] = np.sin(0.1*np.sqrt((i-50.)**2.+(j-50.)**2))

In [164]:
grid


Out[164]:
array([[0.70886129, 0.65752491, 0.60351654, ..., 0.54721238, 0.60351654,
        0.65752491],
       [0.65752491, 0.6023654 , 0.54477011, ..., 0.48513083, 0.54477011,
        0.6023654 ],
       [0.60351654, 0.54477011, 0.48384227, ..., 0.42113947, 0.48384227,
        0.54477011],
       ...,
       [0.54721238, 0.48513083, 0.42113947, ..., 0.3556584 , 0.42113947,
        0.48513083],
       [0.60351654, 0.54477011, 0.48384227, ..., 0.42113947, 0.48384227,
        0.54477011],
       [0.65752491, 0.6023654 , 0.54477011, ..., 0.48513083, 0.54477011,
        0.6023654 ]])

Plotting a slice of the data


In [165]:
fig, ax = plt.subplots(1,1)
ax.plot(grid[0])


Out[165]:
[<matplotlib.lines.Line2D at 0x10d9ae198>]

Plotting a "heatmap"

By default python uses the viridis colormap, which is good.


In [166]:
fig, ax = plt.subplots(1,1)
img1 = ax.imshow(grid)
cb = fig.colorbar(img1)
cb.set_label("temperature [C]")
ax.set_ylabel("y [m]")
ax.set_xlabel("x [m]")


Out[166]:
Text(0.5,0,'x [m]')

Bad colormap example


In [167]:
fig, ax = plt.subplots(1,1)
img1 = ax.imshow(grid,cmap="jet")
cb = fig.colorbar(img1)
cb.set_label("temperature [C]")
ax.set_ylabel("y [m]")
ax.set_xlabel("x [m]")


Out[167]:
Text(0.5,0,'x [m]')

In [ ]: